package com.demo.blockchain;

import com.demo.blockchain.tool.Encrypt;

/**工作量证明：
 * 让我们来实现一个相似PoW算法，规则是：寻找一个数 p，使得它与前一个区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头：
 * 衡量算法复杂度的办法是修改零开头的个数。使用4个来用于演示，你会发现多一个零都会大大增加计算出结果所需的时间。
 * 现在Blockchain类基本已经完成了，接下来使用Servlet接收HTTP请求来进行交互。
 * @author DELL
 *
 */
public class ProofWork {

	/**
     * 简单的工作量证明:
     *   - 查找一个 p' 使得 hash(pp') 以4个0开头
     *   - p 是上一个块的证明, p' 是当前的证明
     *
     * @param last_proof
     *               上一个块的证明
     * @return
     */
    public static long proofOfWork(long last_proof) {
        long proof = 0;
        while (!validProof(last_proof, proof)) {
            proof += 1;
        }
        return proof;
    }

    /**
     * 验证证明: 是否hash(last_proof, proof)以4个0开头?
     *
     * @param last_proof
     *            上一个块的证明
     * @param proof
     *            当前的证明
     * @return 以4个0开头返回true，否则返回false
     */
    public static boolean validProof(long last_proof, long proof) {
        String guess = last_proof + "" + proof;
        String guess_hash = new Encrypt().getSHA256(guess);
        return guess_hash.startsWith("0000");
    }

}
